home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 October
/
EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso
/
Aminet
/
mus
/
play
/
tracker_4_31.lzh
/
tracker
/
Arch
/
SBOS2
/
audio.c
next >
Wrap
Text File
|
1995-05-15
|
6KB
|
215 lines
/* soundblaster_audio.c */
/* modified by David Nichols for this PM MOD player */
/* MODIFIED BY Michael Fulbright (MSF) to work with os/2 device driver */
/* $Author: espie $
* $Id: audio.c,v 1.6 1995/05/15 13:16:24 espie Exp espie $
* $Log: audio.c,v $
* Revision 1.6 1995/05/15 13:16:24 espie
* Updated.
*
* Revision 1.5 1995/02/23 22:41:45 espie
* Added # of bits.
*
* Revision 1.4 1995/02/23 17:03:14 espie
* Continuing changes for a standard file.
*
* Revision 1.3 1995/02/23 13:52:30 espie
* primary, secondary -> primary+secondary, primary-secondary
* strike out 2 multiplications out of 4 !
*
* Revision 1.2 1995/02/21 17:57:55 espie
* Internal problem: RCS not working.
*
*/
#define INCL_DOS
#include "defs.h"
#include <os2.h>
#include "sbos2_user.h"
#include "extern.h"
#include "song.h"
#define DEFAULT_SET_MIX
#define DEFAULT_BUFFERS
#define UNSIGNED8
#define NEW_OUTPUT_SAMPLES_AWARE
#include "Arch/common.c"
struct sb_mixer_levels sbLevels;
struct sb_mixer_params sbParams;
ID("$Id: audio.c,v 1.6 1995/05/15 13:16:24 espie Exp espie $");
HFILE hAudio; /* audio handle */
int fixparams = 0;
int filterout;
int filterin;
int filterhi;
void restoreparams()
{
ULONG parlen, datlen;
if (fixparams)
{
parlen = 0;
datlen = sizeof(struct sb_mixer_params);
DosDevIOCtl(hAudio, DSP_CAT, MIXER_IOCTL_READ_PARAMS,
NULL, 0, &parlen, &sbParams, datlen, &datlen);
sbParams.hifreq_filter = filterhi;
sbParams.filter_output = filterout;
sbParams.filter_input = filterin;
parlen = 0;
datlen = sizeof(struct sb_mixer_params);
DosDevIOCtl(hAudio, DSP_CAT, MIXER_IOCTL_SET_PARAMS,
NULL, 0, &parlen, &sbParams, datlen, &datlen);
}
}
int open_audio(int frequency, int DMAbuffersize)
{
USHORT status, freq;
USHORT flag;
ULONG datlen, parlen, action, temp;
/* MSF - open SBDSP for output */
status = DosOpen( "SBDSP$", &hAudio, &action, 0, FILE_NORMAL, FILE_OPEN,
OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYREADWRITE |
OPEN_FLAGS_WRITE_THROUGH | OPEN_FLAGS_NOINHERIT |
OPEN_FLAGS_NO_CACHE | OPEN_FLAGS_FAIL_ON_ERROR, NULL );
if (status != 0)
end_all("Error opening audio device SBDSP$");
/* see if we are on a SBREG or SBPRO */
status = DosOpen( "SBMIX$", &temp, &action, 0, FILE_NORMAL, FILE_OPEN,
OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE |
OPEN_FLAGS_WRITE_THROUGH | OPEN_FLAGS_NOINHERIT |
OPEN_FLAGS_NO_CACHE, NULL );
if (status !=0) stereo=FALSE;
else
{
fixparams = TRUE;
parlen = 0;
datlen = sizeof(struct sb_mixer_params);
DosDevIOCtl(hAudio, DSP_CAT, MIXER_IOCTL_READ_PARAMS,
NULL, 0, &parlen, &sbParams, datlen, &datlen);
filterhi = sbParams.hifreq_filter;
filterout = sbParams.filter_output;
filterin = sbParams.filter_input;
sbParams.hifreq_filter = TRUE;
sbParams.filter_output = FALSE;
sbParams.filter_input = TRUE;
parlen = 0;
datlen = sizeof(struct sb_mixer_params);
DosDevIOCtl(hAudio, DSP_CAT, MIXER_IOCTL_SET_PARAMS,
NULL, 0, &parlen, &sbParams, datlen, &datlen);
datlen=1;
parlen=0;
flag=stereo;
status=DosDevIOCtl(hAudio, DSP_CAT, DSP_IOCTL_STEREO,
NULL, 0, &parlen, &flag, 1, &datlen);
if (status != 0)
end_all("Error setting stereo/mono");
datlen = 1;
flag = DMAbuffersize * 1024;
DMAbuffersize = flag;
status=DosDevIOCtl(hAudio, DSP_CAT, DSP_IOCTL_BUFSIZE,
NULL, 0, &parlen, &DMAbuffersize, datlen, &datlen);
if (status != 0)
end_all("Error setting DMA buffer size");
}
if (stereo) frequency *= 2; /* XXX Stereo takes twice the speed */
if (frequency == 0) frequency = -1; /* read current frequency from driver */
/* set speed */
datlen=2;
parlen=0;
freq = (USHORT) frequency;
status=DosDevIOCtl(hAudio, DSP_CAT, DSP_IOCTL_SPEED,
NULL, 0, &parlen, &freq, 2, &datlen);
frequency=freq;
if (status!=0)
end_all("Error setting frequency");
buffer = malloc (sizeof(SAMPLE) * frequency); /* Stereo makes x2 */
idx = 0;
if (stereo) return (frequency / 2);
else return (frequency);
}
void output_samples (int left, int right, int n)
{
add_samples8(left, right, n);
}
void discard_buffer()
{
/* not implemented */
}
void flush_buffer ()
{
ULONG numread, status;
status = DosWrite(hAudio, buffer, idx, &numread);
if (status != 0)
{
char buf[80];
sprintf(buf, "Error writing to audio device: %d, tried to write: %d, wrote: %d", status, idx, numread);
end_all(buf);
}
if (numread != idx)
{
char buf[80];
sprintf(buf, "DosWrite mismatch, idx: %d, numread: %d", idx, numread);
notice(buf);
}
idx = 0;
}
void flush_DMA_buffers()
{
ULONG status, datlen, parlen;
/* now tell device driver to flush out internal buffers */
parlen=0;
datlen=0;
status=DosDevIOCtl(hAudio, DSP_CAT, DSP_IOCTL_FLUSH,
NULL, 0, &parlen, NULL, 0, &datlen);
if (status != 0)
{
char buf[80];
sprintf(buf, "Error flushing DMA buffers: %d", status);
notice(buf);
}
}
void close_audio ()
{
DosClose(hAudio);
}
int update_frequency()
{
/* not implemented */
return 0;
}
void set_synchro(int s)
{
/* not implemented */
}